package futbolfacil.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import futbolfacil.excepcion.DAOExcepcion;
import futbolfacil.modelo.Cliente;
import futbolfacil.util.ConexionBD;

public class ClienteDAO extends BaseDAO  {
	
	public Collection<Cliente> buscarPorNombre(String nombre) throws DAOExcepcion {
		System.out.println("ClienteDAO: buscarClientePorNombre(String nombre)");
		String query = "SELECT * " +
			"FROM usuario u, usuario_tipo tu WHERE " +
			"u.usr_tip_cod = tu.usr_tip_cod AND usr_nom like ?";
		
		Collection<Cliente> lista = new ArrayList<Cliente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cliente cli = new Cliente();
				//cli.setCodigoUsuario(rs.getInt("usr_cod"));
				cli.setUsuarioUsuario(rs.getString("usr_usr"));
				cli.setPasswordUsuario(rs.getString("usr_pwd"));
				cli.setNombreUsuario(rs.getString("usr_nom"));
				cli.setPaternoUsuario(rs.getString("usr_pat"));
				cli.setMaternoUsuario(rs.getString("usr_mat"));
				cli.setRazonSocial(rs.getString("usr_raz_soc"));
				cli.setDireccionUsuario(rs.getString("usr_dir"));
				cli.setDistritoUsuario(rs.getString("usr_dis"));
				cli.setFechaNacUsuario(rs.getString("usr_fec_nac").toString());
				cli.setTipoDocUsuario(rs.getString("usr_doc_tip"));
				cli.setNumeroDocUsuario(rs.getString("usr_doc_nro"));
				cli.setSexoUsuario(rs.getString("usr_sex"));
				cli.setTelefonoUsuario(rs.getString("usr_tlf"));
				cli.setCorreoUsuario(rs.getString("usr_cor"));
				cli.setEstadoUsuario(rs.getString("usr_est"));
				cli.setFechaUsuario(rs.getString("usr_fec_reg").toString());
				cli.setPrivilegioUsuario(rs.getString("usr_tip_des"));
				
				lista.add(cli);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public void insertar(Cliente cli) throws DAOExcepcion {
		System.out.println("ClienteDAO: insertar(Cliente cli)");
		
		validarDatos(cli);		
		validarDuplicado(cli);
		validarPassword(cli);
		validarCorreo(cli);
		
		String query = "INSERT INTO usuario(usr_usr, usr_pwd, usr_nom, usr_pat, usr_mat, " +
				"usr_raz_soc, usr_dir, usr_dis, usr_fec_nac, usr_doc_tip, usr_doc_nro, usr_sex, usr_tlf, " +
				"usr_cor, usr_est, usr_fec_reg, usr_tip_cod) " +
				"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);		
			stmt.setString(1, cli.getUsuarioUsuario());
			stmt.setString(2, cli.getPasswordUsuario());
			stmt.setString(3, cli.getNombreUsuario());
			stmt.setString(4, cli.getPaternoUsuario());
			stmt.setString(5, cli.getMaternoUsuario());
			stmt.setString(6, cli.getRazonSocial());
			stmt.setString(7, cli.getDireccionUsuario());
			stmt.setString(8, cli.getDistritoUsuario());
			stmt.setString(9, cli.getFechaNacUsuario());
			stmt.setString(10, cli.getTipoDocUsuario());
			stmt.setString(11, cli.getNumeroDocUsuario());
			stmt.setString(12, cli.getSexoUsuario());
			stmt.setString(13, cli.getTelefonoUsuario());
			stmt.setString(14, cli.getCorreoUsuario());
			stmt.setString(15, cli.getEstadoUsuario());
			stmt.setString(16, cli.getFechaUsuario());
			stmt.setString(17, cli.getPrivilegioUsuario());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public boolean verificarExistenciaCorreo(Cliente cli) throws DAOExcepcion {
		
		String query = "SELECT * FROM usuario WHERE usr_cor = ?";
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, cli.getCorreoUsuario());
			rs = stmt.executeQuery();
			if (rs.next()) {
				return false;
			} else {
				return true;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}
	
	public boolean verificarExistenciaDOC(Cliente cli) throws DAOExcepcion {
		
		String query = "SELECT * FROM usuario WHERE usr_doc_nro = ?";
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, cli.getNumeroDocUsuario());
			rs = stmt.executeQuery();
			if (rs.next()) {
				return false;
			} else {
				return true;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	
	public Cliente obtener(String nombre) throws DAOExcepcion {
		System.out.println("ClienteDAO: obtener(String nombre)");
		Cliente cli = new Cliente();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT usr_cod, usr_usr, " +
				"usr_pwd, usr_nom, usr_pat, " +
				"usr_mat, usr_raz_soc, usr_dir, " +
				"usr_dis, usr_fec_nac, usr_doc_tip, " +
				"usr_doc_nro, usr_sex, usr_tlf, " +
				"usr_cor, usr_est, usr_fec_reg, " +
				"tu.usr_tip_des " +
				"FROM usuario u, usuario_tipo tu WHERE " +
				"u.usr_tip_cod = tu.usr_tip_cod AND usr_nom = ?";
			
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, nombre);
			rs = stmt.executeQuery();
			if (rs.next()) {
				cli.setCodigoUsuario(rs.getInt("usr_cod"));
				cli.setUsuarioUsuario(rs.getString("usr_usr"));
				cli.setPasswordUsuario(rs.getString("usr_pwd"));
				cli.setNombreUsuario(rs.getString("usr_nom"));
				cli.setPaternoUsuario(rs.getString("usr_pat"));
				cli.setMaternoUsuario(rs.getString("usr_mat"));
				cli.setRazonSocial(rs.getString("usr_raz_soc"));
				cli.setDireccionUsuario(rs.getString("usr_dir"));
				cli.setDistritoUsuario(rs.getString("usr_dis"));
				cli.setFechaNacUsuario(rs.getString("usr_fec_nac").toString());
				cli.setTipoDocUsuario(rs.getString("usr_doc_tip"));
				cli.setNumeroDocUsuario(rs.getString("usr_doc_nro"));
				cli.setSexoUsuario(rs.getString("usr_sex"));
				cli.setTelefonoUsuario(rs.getString("usr_tlf"));
				cli.setCorreoUsuario(rs.getString("usr_cor"));
				cli.setEstadoUsuario(rs.getString("usr_est"));
				cli.setFechaUsuario(rs.getString("usr_fec_reg").toString());
				cli.setPrivilegioUsuario(rs.getString("usr_tip_des"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return cli;
	}

	public void eliminar(int id) throws DAOExcepcion {
		System.out.println("ClienteDAO: eliminar(int ID)");
		String query = "DELETE FROM usuario WHERE usr_cod = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void actualizar(Cliente cli) throws DAOExcepcion {
		System.out.println("ActualizarDAO: actualizar(Cliente cli)");
		String query = "UPDATE";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, cli.getUsuarioUsuario());
			stmt.setString(2, cli.getPasswordUsuario());
			stmt.setString(3, cli.getNombreUsuario());
			stmt.setString(4, cli.getPaternoUsuario());
			stmt.setString(5, cli.getMaternoUsuario());
			stmt.setString(6, cli.getRazonSocial());
			stmt.setString(7, cli.getDireccionUsuario());
			stmt.setString(8, cli.getDistritoUsuario());
			stmt.setString(9, cli.getFechaNacUsuario());
			stmt.setString(10, cli.getTipoDocUsuario());
			stmt.setString(11, cli.getNumeroDocUsuario());
			stmt.setString(12, cli.getSexoUsuario());
			stmt.setString(13, cli.getTelefonoUsuario());
			stmt.setString(14, cli.getCorreoUsuario());
			stmt.setString(15, cli.getEstadoUsuario());
			stmt.setString(16, cli.getFechaUsuario());
			stmt.setString(17, cli.getPrivilegioUsuario());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<Cliente> listar() throws DAOExcepcion {
		System.out.println("ClienteDAO: listar()");
		Collection<Cliente> c = new ArrayList<Cliente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT usr_cod, usr_usr, " +
				"usr_pwd, usr_nom, usr_pat, " +
				"usr_mat, usr_raz_soc, usr_dir, " +
				"usr_dis, usr_fec_nac, usr_doc_tip, " +
				"usr_doc_nro, usr_sex, usr_tlf, " +
				"usr_cor, usr_est, usr_fec_reg, " +
				"tu.usr_tip_des " +
				"FROM usuario u, usuario_tipo tu WHERE " +
				"u.usr_tip_cod = tu.usr_tip_cod AND u.usr_tip_cod = 3";
			
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cliente cli = new Cliente();
				cli.setCodigoUsuario(rs.getInt("usr_cod"));
				cli.setUsuarioUsuario(rs.getString("usr_usr"));
				cli.setPasswordUsuario(rs.getString("usr_pwd"));
				cli.setNombreUsuario(rs.getString("usr_nom"));
				cli.setPaternoUsuario(rs.getString("usr_pat"));
				cli.setMaternoUsuario(rs.getString("usr_mat"));
				cli.setRazonSocial(rs.getString("usr_raz_soc"));
				cli.setDireccionUsuario(rs.getString("usr_dir"));
				cli.setDistritoUsuario(rs.getString("usr_dis"));
				cli.setFechaNacUsuario(rs.getString("usr_fec_nac").toString());
				cli.setTipoDocUsuario(rs.getString("usr_doc_tip"));
				cli.setNumeroDocUsuario(rs.getString("usr_doc_nro"));
				cli.setSexoUsuario(rs.getString("usr_sex"));
				cli.setTelefonoUsuario(rs.getString("usr_tlf"));
				cli.setCorreoUsuario(rs.getString("usr_cor"));
				cli.setEstadoUsuario(rs.getString("usr_est"));
				cli.setFechaUsuario(rs.getString("usr_fec_reg").toString());
				cli.setPrivilegioUsuario(rs.getString("usr_tip_des"));
				
				c.add(cli);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	private void validarDatos(Cliente objCliente) throws DAOExcepcion {
		System.out.println("ClienteDAO: validarDatos(Cliente vo)");
		
		String msg = "";
		
		if(objCliente.getUsuarioUsuario().trim().equals(""))
			msg += "Usuario del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getPasswordUsuario().trim().equals(""))
			msg += "Password del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getPasswordUsuario2().trim().equals(""))
			msg += "Password de verifacion del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getNombreUsuario().trim().equals(""))
			msg += "Nombre del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getPaternoUsuario().trim().equals(""))
			msg += "Apellido paterno del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getMaternoUsuario().trim().equals(""))
			msg += "Apellido materno del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getDireccionUsuario().trim().equals(""))
			msg += "Direccion del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getDistritoUsuario().trim().equals(""))
			msg += "Distrito del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getFechaNacUsuario().trim().equals(""))
			msg += "Fecha de nacimiento del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getTipoDocUsuario().trim().equals(""))
			msg += "Tipo de documento del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getNumeroDocUsuario().trim().equals(""))
			msg += "Numero de documento del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getSexoUsuario().trim().equals(""))
			msg += "Sexo del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getTelefonoUsuario().trim().equals(""))
			msg += "Telefono del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getCorreoUsuario().trim().equals(""))
			msg += "Correo del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getCorreoUsuario2().trim().equals(""))
			msg += "Correo de verificacion del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getEstadoUsuario().trim().equals(""))
			msg += "Estado del Cliente no puede ser vacio. <br /> \n";
		if(objCliente.getPrivilegioUsuario().trim().equals(""))
			msg += "Privilegios del Cliente no puede ser vacio. <br /> \n";
		if(!msg.equals("")) {
			System.out.println("ERROR: <br /> \n" + msg);
			throw new DAOExcepcion(msg);
		}	
	}
	
	private void validarDuplicado(Cliente objCliente) throws DAOExcepcion {
		System.out.println("ClienteDAO: validarDuplicado(Cliente objCliente)");
		
		String msg = "";
		
		if(existeCliente("usr_usr", objCliente.getUsuarioUsuario()))
			msg += "Cliente: " + objCliente.getUsuarioUsuario() + " ya existe. <br /> \n";
		if(existeCliente("usr_doc_nro", objCliente.getNumeroDocUsuario()))
			msg += "DNI: " + objCliente.getNumeroDocUsuario() + " ya existe. <br /> \n";
		if(existeCliente("usr_cor", objCliente.getCorreoUsuario()))
			msg += "Correo: " + objCliente.getCorreoUsuario() + " ya existe. <br /> \n";
		if(!msg.equals("")) {
			System.out.println("ERROR: <br /> \n" + msg);
			throw new DAOExcepcion(msg);
		}
	}
	
	private boolean existeCliente(String campo, String valor) {
		System.out.println("ClienteDAO: existeCliente(String campo, String valor)");
		
		String query = "SELECT * FROM usuario WHERE "+ campo +" = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, valor);
			rs = stmt.executeQuery();			
			if (rs.next()){
				return true;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return false;
	}

	private void validarPassword(Cliente objCliente) throws DAOExcepcion {
		String p1 = objCliente.getPasswordUsuario();
		String p2 = objCliente.getPasswordUsuario2();
		
		if(!p1.equals(p2)) {
			System.out.println("ERROR: <br /> \n" + "Los passwords no coinciden!");
			throw new DAOExcepcion("Passwords no coinciden.");
		}			
	}

	private void validarCorreo(Cliente objCliente) throws DAOExcepcion {
		String correo1 = objCliente.getCorreoUsuario();
		String correo2 = objCliente.getCorreoUsuario2();
		
		if(!correo1.equals(correo2)) {
			System.out.println("ERROR: <br /> \n" + "Los correos no coinciden!");
			throw new DAOExcepcion("Correos no coinciden.");
		}					
	}

	public Cliente buscarPorCodigo(int codigo) throws DAOExcepcion {
		System.out.println("ClienteDAO: obtener(String nombre)");
		Cliente cli = new Cliente();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT usr_cod, usr_usr, " +
				"usr_pwd, usr_nom, usr_pat, " +
				"usr_mat, usr_raz_soc, usr_dir, " +
				"usr_dis, usr_fec_nac, usr_doc_tip, " +
				"usr_doc_nro, usr_sex, usr_tlf, " +
				"usr_cor, usr_est, usr_fec_reg, " +
				"tu.usr_tip_des " +
				"FROM usuario u, usuario_tipo tu WHERE " +
				"u.usr_tip_cod = tu.usr_tip_cod AND usr_cod = ?";
			
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codigo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				cli.setCodigoUsuario(rs.getInt("usr_cod"));
				cli.setUsuarioUsuario(rs.getString("usr_usr"));
				cli.setPasswordUsuario(rs.getString("usr_pwd"));
				cli.setNombreUsuario(rs.getString("usr_nom"));
				cli.setPaternoUsuario(rs.getString("usr_pat"));
				cli.setMaternoUsuario(rs.getString("usr_mat"));
				cli.setRazonSocial(rs.getString("usr_raz_soc"));
				cli.setDireccionUsuario(rs.getString("usr_dir"));
				cli.setDistritoUsuario(rs.getString("usr_dis"));
				cli.setFechaNacUsuario(rs.getString("usr_fec_nac").toString());
				cli.setTipoDocUsuario(rs.getString("usr_doc_tip"));
				cli.setNumeroDocUsuario(rs.getString("usr_doc_nro"));
				cli.setSexoUsuario(rs.getString("usr_sex"));
				cli.setTelefonoUsuario(rs.getString("usr_tlf"));
				cli.setCorreoUsuario(rs.getString("usr_cor"));
				cli.setEstadoUsuario(rs.getString("usr_est"));
				cli.setFechaUsuario(rs.getString("usr_fec_reg").toString());
				cli.setPrivilegioUsuario(rs.getString("usr_tip_des"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return cli;
	}
}